{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Scikit-learn Compatibility"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 - Introduction\n",
    "\n",
    "`pysurvival` estimator models can be adapted to be used with [`scikit-learn`](https://scikit-learn.org/)'s cross-validation, hyperparameter optimization, and pipeline functionalities. This notebook explains, via simple examples, how to convert `pysurvival` built-in estimators to `scikit-learn`-compatible estimators and use available functionalities for the latter.\n",
    "\n",
    "This experimental feature of `pysurvival` is inspired by the package [lifelines](https://github.com/CamDavidsonPilon/lifelines) and its module [`sklearn_adapter`](https://lifelines.readthedocs.io/en/latest/Compatibility%20with%20scikit-learn.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2 - Basics of Module `sklearn_adapter`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1 - Adapting a Built-in Estimator Model\n",
    "\n",
    "An estimator model in `pysurvival` can be *adapted* and made compatible with `scikit-learn` via function `sklearn_adapter` as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from pysurvival.datasets import Dataset\n",
    "from pysurvival.utils.sklearn_adapter import sklearn_adapter\n",
    "from pysurvival.utils.metrics import concordance_index\n",
    "from pysurvival.models.multi_task import LinearMultiTaskModel\n",
    "\n",
    "# Load and split a simple example into train/test sets\n",
    "ds = Dataset(\"simple_example\")\n",
    "X_train, T_train, E_train, X_test, T_test, E_test = ds.load_train_test()\n",
    "Y_train = pd.concat((pd.DataFrame(T_train, columns=[ds.time_column]), pd.DataFrame(E_train, columns=[ds.event_column])), axis=1)\n",
    "Y_test = pd.concat((pd.DataFrame(T_test, columns=[ds.time_column]), pd.DataFrame(E_test, columns=[ds.event_column])), axis=1)\n",
    "\n",
    "# Adapt class LinearMultiTaskModel to make it compatible with scikit-learn\n",
    "LinearMultiTaskModelSkl = sklearn_adapter(LinearMultiTaskModel, time_col=ds.time_column, event_col=ds.event_column,\n",
    "                                          predict_method=\"predict_survival\", scoring_method=concordance_index)\n",
    "\n",
    "# Instantiate an object of the new class LinearMultiTaskModelSkl\n",
    "mtlr_model_skl = LinearMultiTaskModelSkl()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the call to function `sklearn_adapter` requires the names of the time and event columns, because the adapted class must know how to extract the event data (specific to survival data). The name of the predict method may also be specified (refer to the documentation of each estimator for the available `predict_*` methods). The default scoring method is the `concordance_index`.\n",
    "\n",
    "The new convention requires that the array of event data is stored in the same `DataFrame` as the time data. The adapted class properly handles this two-column `DataFrame` automatically."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 - Model Fitting\n",
    "\n",
    "With the exception of the non-parametric estimator (class `KaplanMeierModel`), all other estimator models' `fit` method contains three mandatory input arguments: `X` (array of predictor data), `T` (array of time data), and `E` (array of event data). The `KaplanMeierModel`' `fit` method only requires `T` and `E`. This convention is not compatible with the `fit` method of class `BaseEstimator` in `scitkit-learn`.\n",
    "\n",
    "Now, with the adapted class, the `fit` method has the same signature as that of class `BaseEstimator` in `scitkit-learn`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "% Completion: 100%|**********************************************|Loss: 1266.32\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "SkLearnLinearMultiTaskModel(auto_scaler=True, bins=100)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Equivalent to calling method fit of class LinearMultiTaskModel\n",
    "mtlr_model_skl.fit(X_train, Y_train, init_method=\"orthogonal\", optimizer=\"adam\", lr=1e-4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The only required input arguments are `X` (predictors) and `Y` (time and event). All input arguments beyond that are passed as a `fit_params` dictionary to the specific estimator model's `fit` method."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3 - Model Prediction\n",
    "\n",
    "Predicting from a model using the adapted class works similarly to predicting from class `BaseEstimator` in `scitkit-learn`. Note that, from the call to function `sklearn_adapter`, the method whose name matches the `predict_method` name will be used."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Equivalent to calling the method predict_survival of class LinearMultiTaskModel\n",
    "mtlr_model_skl_y_pred = mtlr_model_skl.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.4 - Model Score\n",
    "\n",
    "Similarly for calculating the model score:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Scikit-learn LinearMultiTaskModel model c-index = 0.9579225723673247\n"
     ]
    }
   ],
   "source": [
    "# Equivalent to calling function concordance_index on an object of class LinearMultiTaskModel\n",
    "mtlr_model_score = mtlr_model_skl.score(X_test, Y_test)\n",
    "print(\"Scikit-learn LinearMultiTaskModel model c-index = {}\".format(mtlr_model_score))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.5 - Additional Functionalities\n",
    "\n",
    "The original built-in estimator model instance can be retrieved with the attribute `pysurvival_model`. This can be useful when obtaining disgnostics plots, for example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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r776iiZNmtCkSRMSExM5ffq0e5vLoUOHmD17tlc7Q0JCWLVqVbrft797HUh566nA1FTba1WggN/dOuWCUup6FBISQqNGjVi2bBmvvfZapmVLly7t/r9+TwcPHqRYsWIBb9sNN9xAcHBwunP6fi5WrBjBwcGsXbvWK0hx8Q3EMhMVFeV3cLznuQAWLVrk90u0atWq2T7XpcjJNfvrjRQRHnzwQWbPns2IESOYPXs2bdu2pVChQoAN7BYvXsyECRPo3bu3+7i0tLRM2xUUFES/fv3o168fv/32Gx9++CGDBw+mbNmyXvW4lClThg0bNrg/u6bduBiugDgpKclryo6DBw8CF353jRo1whjD6tWrWbduHaNGjaJGjRoULFiQFStWsGnTJp5//nn38a4eTH/jAF33yyU7Pb+XIu/0WIno7OtKKZWBZ599lsTExHRPlIH9Iv3ss88AuOOOO0hKSuLLL7907z958iSLFy+mcePGAW9Xvnz5qFWrFgsWLPDaPm/ePK/PLVq04Pz58xw9epR69eqle7l6gbKjZcuWHD58OMNJKBs2bEh4eDh//PGH33P5ftEGQv78+dP1EgXimmNjY/nll19YtGgRa9asITY21r3vzJkznD9/3ivQ+euvv/j000+z3e7y5cvz4osvEhMTw7Zt2zK8Ns9233rrrdmu39ctt9xCREQEc+fO9do+Z84cqlSpwg3O9CdFixbllltuYdy4ceTLl4/atWsjIjRu3JjRo0dz7tw5r7/nli1bsnXrVmrUqJHuPl+uQNolb/VYGQOHDtmffiJKzx6rqVNh+vQLn4OCoGVLiI/3e6hSSl3V2rdvT//+/Xn00UdZu3YtHTt2pGDBguzYsYNJkyYRHR1NmzZtaN26NY0aNaJbt26MHDmSqKgoxowZw6lTp7z+Dz+QBg0axP33388TTzxB586dWbNmjTvQc6latSq9e/cmNjaWgQMHUq9ePU6fPs3WrVvZuXMnU6dOzfb5WrVqRevWrXnooYcYOnQoderUYf/+/Xz55Ze89957FClShPj4ePr27cuePXu46667SEtLY+fOnaxatSpXJlKtVq0aixcvpk2bNhQsWJCqVasG5Jrr1q1LTEwMcXFxhIeHc99997n3FS5cmPr16/PKK6+405UjR46kcOHCHDt2LMM6H3/8cYoVK0aDBg0oXLgwq1at4qeffmLU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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'root_mean_squared_error': 28.95925380459718,\n",
       " 'median_absolute_error': 19.640989742292277,\n",
       " 'mean_absolute_error': 22.83624099875313}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from pysurvival.utils.display import compare_to_actual\n",
    "compare_to_actual(mtlr_model_skl.pysurvival_model, X_test, T_test, E_test, is_at_risk=True, figure_size=(10, 8),\n",
    "                  metrics=[\"rmse\", \"mean\", \"median\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3 - Scikit-learn's Funcionalities"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 - Cross-validation Score\n",
    "\n",
    "The following computes 5-fold cross-validation scores of an object of the adapted `LinearMultiTaskModel` class. Additional fitting parameters are passed in the dictionary `fit_params`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The gradient exploded... You should reduce the learningrate (lr) of your optimizer\n",
      "The gradient exploded... You should reduce the learningrate (lr) of your optimizer\n",
      "The gradient exploded... You should reduce the learningrate (lr) of your optimizer\n",
      "The gradient exploded... You should reduce the learningrate (lr) of your optimizer\n",
      "The gradient exploded... You should reduce the learningrate (lr) of your optimizer\n",
      "[0.97162244 0.96908122 0.96863263 0.97496285 0.96817657]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "scores = cross_val_score(mtlr_model_skl, X_train, Y_train, cv=5,  fit_params={\"init_method\": \"glorot_uniform\", \n",
    "                                                                              \"l2_reg\": 1e-2, \"lr\": 1e-2, \n",
    "                                                                              \"tol\": 1e-4, \"verbose\": False})\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 - Hyperparameter Tuning\n",
    "\n",
    "The following tunes a specific hyperparameter of the `fit` method of class `LinearMultiTaskModel` using grid search cross-validation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "% Completion: 100%|***********************************************|Loss: 896.70\n",
      "% Completion: 100%|**********************************************|Loss: 1006.87\n",
      "% Completion: 100%|***********************************************|Loss: 909.28\n",
      "% Completion: 100%|**********************************************|Loss: 1061.29\n",
      "% Completion: 100%|**********************************************|Loss: 1007.42\n",
      "% Completion: 100%|***********************************************|Loss: 910.50\n",
      "% Completion: 100%|***********************************************|Loss: 914.24\n",
      "% Completion: 100%|**********************************************|Loss: 1021.68\n",
      "% Completion: 100%|**********************************************|Loss: 1062.32\n",
      "% Completion: 100%|***********************************************|Loss: 917.06\n",
      "% Completion: 100%|***********************************************|Loss: 990.86\n",
      "% Completion: 100%|**********************************************|Loss: 1071.46\n",
      "% Completion: 100%|**********************************************|Loss: 1090.55\n",
      "% Completion: 100%|**********************************************|Loss: 1071.96\n",
      "% Completion: 100%|***********************************************|Loss: 998.82\n",
      "% Completion: 100%|**********************************************|Loss: 1050.45\n",
      "% Completion: 100%|**********************************************|Loss: 1087.66\n",
      "% Completion: 100%|**********************************************|Loss: 1010.32\n",
      "% Completion: 100%|**********************************************|Loss: 1036.32\n",
      "% Completion: 100%|**********************************************|Loss: 1034.98\n",
      "% Completion: 100%|**********************************************|Loss: 1252.76\r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SkLearnLinearMultiTaskModel(auto_scaler=True, bins=100)\n",
      "{'l2_reg': 0.1}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "reg = GridSearchCV(mtlr_model_skl, {\"l2_reg\": [1E-2, 1E-1, 1, 10]}, cv=5)\n",
    "reg.fit(X_train, Y_train)\n",
    "\n",
    "print(reg.best_estimator_)\n",
    "print(reg.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 - Pipeline\n",
    "\n",
    "The following constructs a pipeline with two steps: Principal Component Analysis (`PCA`) and an object of the adapted class `LinearMultiTaskModel`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "% Completion: 100%|**********************************************|Loss: 1261.96\r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pipeline(memory=None,\n",
      "         steps=[('reduce_dim',\n",
      "                 PCA(copy=True, iterated_power='auto', n_components=None,\n",
      "                     random_state=None, svd_solver='auto', tol=0.0,\n",
      "                     whiten=False)),\n",
      "                ('reg',\n",
      "                 SkLearnLinearMultiTaskModel(auto_scaler=True, bins=100))],\n",
      "         verbose=False)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "estimators = [(\"reduce_dim\", PCA()), (\"reg\", mtlr_model_skl)]\n",
    "pipe = Pipeline(estimators)\n",
    "pipe.fit(X_train, Y_train)\n",
    "print(pipe)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 - Conclusion\n",
    "\n",
    "In this notebook, we have shown how built-in estimator models can be adapted to be compatible with `sckikit-learn` and its functionalities."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
